// Generator 配合 Promise 的异步方案

function ajax (url){
  return new Promise(function(resolve, reject){
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url)
    xhr.responseType = 'json'
    xhr.onload = function() { // 请求完成后
      if (this.status === 200) {
        resolve(this.response)
      }else{
        reject(new Error(this.statusText))
      }
    }
    xhr.send() // 开始执行
  })
}

function * main (){
  try {
    const users = yield ajax('./api/users.json')
    console.log(users)

    const users2 = yield ajax('./api/users.json')
    console.log(users2)
  } catch (e){
    console.log(e)
  }
}

const g = main()

// const result = g.next()
// result.value.then((data)=>{
//   const result2 = g.next(data)
//   result2.value.then(data => {
//     g.next(data)
//   })
// })


// 递归实现 生成器函数执行器
function handleResult (result) {
  if(result.done) return // 生成器函数结束
  result.value.then(data=>{
    handleResult(g.next(data))
  },err => {
    g.throw(error)
  })
}

handleResult(g.next())

// 封装生成器函数执行器
function co (generator){
  const g = generator()

  function handleResult (result) {
    if(result.done) return // 生成器函数结束
    result.value.then(data=>{
      handleResult(g.next(data))
    },err => {
      g.throw(error)
    })
  }
  
  handleResult(g.next())

}

// 社区中完善的库，https://github.com/tj/co
// 出现 async await 后就没有那么普及了
